package com.hup.utils.commons.exception;


import com.hup.utils.commons.JavaUtil;

import java.lang.reflect.Type;

public interface ExceptionMsgParser<E extends Throwable> {

    /**
     * @return 默认情况return e instanceof E
     */
    @SuppressWarnings("unchecked")
    default boolean isMatch(Throwable e) {
        Type[] interfaceType = JavaUtil.getInterfaceType(this, ExceptionMsgParser.class);
        Class<E> clz = (Class<E>) interfaceType[0];
        return clz.isInstance(e);
        //return clz.isAssignableFrom(e.getClass());//一样的
    }

    /**
     * 解析异常消息
     */
    String getMsg(E e);

    /**
     * @return 这个异常的堆栈信息;不重写时,默认是会拿堆栈信息给ErrInfo的;
     * @apiNote 重写后返回null代表ErrInfo中不会有堆栈信息
     */
    default String getTrace(E e) {
        return TraceHandler.TRACE_HANDLER.getTrace(e);
    }

    /**
     * 默认的构造ErrInfo的方法,默认会调用上面两个方法的结构进行构造;
     * 特殊情况,可以重写此方法构造ErrInfo
     */
    default ErrInfo getInfo(String msgHead, E e) {
        ErrInfo res = new ErrInfo();
        res.setMsg(msgHead, getMsg(e));
        res.setTrace(getTrace(e));
        return res;
    }

}